#include <iostream>
#include <string>

#include "user.pb.h"
#include "mprpcapplication.h"
#include "rpcprovider.h"
#include "logger.h"

// 进程中的普通类
class UserService : public fixbug::UserServiceRpc
{
public:
    bool Login(std::string &name, std::string &pwd)
    {
        if (name.empty() || pwd.empty())
            return false;

        std::cout << "name: " << name << std::endl;
        std::cout << "pwd: " << pwd << std::endl;
        return true;
    }

    // 重写基类UserServiceRpc的虚函数
    // caller   ===> Login(LoginRequest)    ===>   muduo   ===>   callee
    // callee   ===> Login(LoginRequest)    ===>   交到下面这个Login方法
    // ::google::protobuf::Closure这个类是个抽象类
    virtual void Login(::google::protobuf::RpcController *controller,
                       const ::fixbug::LoginRequest *request,
                       ::fixbug::LoginResponse *response,
                       ::google::protobuf::Closure *done)
    {
        // 框架给业务上报了请求参数LoginRequest
        std::string name = request->name();
        std::string pwd = request->pwd();

        // 处理业务
        bool login_res = Login(name, pwd);

        // 把响应写入对应的LoginResponse类
        fixbug::ResultCode *rc = response->mutable_result();
        if(login_res)
        {
            rc->set_errorno(0);
            rc->set_errmsg("");
            response->set_success(login_res);
        }

        // 执行回调(将response序列化 + muduo网络放送)
        done->Run();
    }
};

int main(int argc, char *argv[])
{
    // LOG_INFO("Yes!, %s - %s - %d", __FILE__, __FUNCTION__, __LINE__);
    // LOG_ERR("No!, %s - %s - %d", __FILE__, __FUNCTION__, __LINE__);

    // 调用框架的初始化操作
    MprpcApplication::Init(argc, argv);

    // provider是一个rpc网络服务对象
    RpcProvider provider;

    // 把UserService对象发布到rpc节点上
    provider.NotifyService(new UserService());

    // 启动一个rpc服务节点，此后进入阻塞状态，等待远程的rpc调用
    provider.Run();
    return 0;
}